package main

import "os"

/*
下划线是什么：一种特使的标识符
Go语言中，"_" 是一种特殊的标识符，用来忽略结果。
下划线怎么使用
Go语言中，import 的作用是导入其他package。
包导入的常规语法：
import (
	"fmt"
)

然后在代码中可以通过如下的方式调用
fmt.Println("hello world")
这个fmt是Go语言的标准库，他其实是去GOROOT下去加载该模块，但绕Go的import 还支持如下两种方式来加载自己写的模块：
相对路径： import "./test_model"  //当前问阿金同一目录的test_model 目录，但是不建议这种方式import
绝对路径： import "mygoprojec/test_model"  //加载GOPATH/src/mygoproject/test_model模块
*/

/*
包导入的一些花操作语法：
1.点操作：
有时候会看到如下的包导入方式：import . "fmt"
这个点操作的含义就是这个包导入之后再你调用这个包的函数时，你可以省略前缀的包名，也就是你前面调用的：
fmt.Println("hello world")
//可以省略成
Println("hello world")

2.别名操作
别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字
import (f "fmt")
//别名操作调用包函数时前缀变成了重命名前缀，即
f.Println("hello world")

3.本文关注的重点： _操作
我们都知道，当导入一个包的时候，该包下的文件里所有init()函数都会被执行。
然而，有时候我们并不需要把在整个包都当导入进来，仅仅是希望他们执行init()函数而已，
这个时候我们就可以使用 import _ 来引用该包，即，使用【import _ 包名】来引用该包，
仅仅是为了调用该包中的init()函数，所以无法他通过包名来调用包中的其他函数
*/
func main() {
	buf := make([]byte, 1024)
	f, _ := os.Open(".....")
	defer f.Close()
	for {
		n, _ := f.Read(buf)
		if n == 0 {
			break
		}
		os.Stdout.Write(buf[:n])
	}
}

/*
解释一：
下划线的作用是忽略这个变量。
比如os.Open ,返回值为 *os.File,error
普通写法是f,err:=os.Open("xxxx")
如果此时，我们不需要知道返回值err是多少
就可以使用 f,_ :=os.Open("xxxxx")
如此忽略了error变量。

解释二：
占位符，意思是那个位置本应赋给某个值，但是咱们不需要这个值。所以就把该值赋给下划线，意思是丢掉不要。
这样编译器可以更好地优化，任何类型的单个值都可以丢给下划线。
这种情况是占位用的，方法返回两个结果，而你只想要一个结果，那另一个就用 "_" 占位，而如果用变量的话不使用编译器会报错。
*/
